#pragma once

#include "noncopyable.h"

#include <functional>
#include <thread>
#include <memory>
#include <unistd.h>
#include <string>
#include <atomic>

class Thread : noncopyable
{
public:
    using ThreadFunc = std::function<void()>; // 一个无参数且无返回值的函数对象，表示线程函数。

    explicit Thread(ThreadFunc, const std::string &name = std::string());
    ~Thread();

    void start();  // 启动线程
    void join();  // 等待线程完成

    bool started() const { return started_; }
    pid_t tid() const { return tid_; }
    const std::string& name() const { return name_; }

    static int numCreated() { return numCreated_; }  // 返回已创建的线程数 
private:
    void setDefaultName();  // 设置默认线程名

    bool started_; // 线程是否已启动
    bool joined_; // 线程是否已分离
    std::shared_ptr<std::thread> thread_;  // 线程对象
    pid_t tid_;  // 线程ID
    ThreadFunc func_;  // 线程函数
    std::string name_;  // 线程名
    static std::atomic_int numCreated_;  // 已创建的线程数量
};
